﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography.X509Certificates;
using System.Xml;
using Sistema.Util;
using Sistema.NFe.Mapeamento.ConsultaNFe;
using Sistema.NFe.Xml.Interfaces;
using Sistema.Dominio;

namespace Sistema.NFe.WebServiceNFe
{
    public class ConsultaStatusNFe : WebServiceNFe
    {
        public ConsultaStatusNFe()
            : base()
        {

        }

        public Tuple<bool, NFeOcorrenciaVO> Consultar(ref NFeDadosEnvioVO DadosRecibo, X509Certificate2 certificado)
        {

            try
            {



                IXmlConsRecibo XmlConsRecibo = new Xml.XmlFactory().GetConsReciboReference();
                XmlConsRecibo.NumeroRecibo = long.Parse(DadosRecibo.Recibo);
                XmlConsRecibo.TipoAmbiente = base._tipoAmbiente;
                XmlConsRecibo.Versao = base._versao;

                XmlDocument DocumentoXmlConsRecibo = new XmlDocument();
                DocumentoXmlConsRecibo.LoadXml(XmlConsRecibo.Xml);

                IConsultaStatusNFe status = base.ConsultaNFe();
                status.DefinirCertificado(certificado);
                status.DefinirCabecalho(((int)base._cUF).ToString(), base.GetVersao(base._versao));
                XmlNode DocumentoXmlRetorno = status.ConsultarNFe(DocumentoXmlConsRecibo);

                IXmlRetornoConsRecibo XmlRetornoConsRecibo = new Xml.XmlFactory().GetRetornoConsReciboReference();
                XmlRetornoConsRecibo.Xml = DocumentoXmlRetorno.OuterXml;

                DadosRecibo.Status = XmlRetornoConsRecibo.Protocolos.FirstOrDefault().Status.ToString();
                DadosRecibo.DescricaoStatus = XmlRetornoConsRecibo.Protocolos.FirstOrDefault().DescricaoProtocolo;

                Tuple<Boolean, NFeOcorrenciaVO> Retorno;

                if (DadosRecibo.Status == "100")
                {
                    Retorno = new Tuple<bool, NFeOcorrenciaVO>(true, new NFeOcorrenciaVO()
                    {
                        Protocolo = XmlRetornoConsRecibo.Protocolos.First().Protocolo.ToString(),
                        XmlOcorrencia = XmlRetornoConsRecibo.Xml,
                        DataOcorrencia = XmlRetornoConsRecibo.Protocolos.First().DataHoraRecebimento,
                        TipoOcorrencia = TipoOcorrencia.Liberacao,
                    });
                }
                else
                {
                    Retorno = new Tuple<bool, NFeOcorrenciaVO>(false, null);
                }

                return Retorno;
            }
            catch (Exception)
            {
                throw;
            }

        }
    }
}
